package in.lib.handler.base;
import in.lib.Constants;
import in.lib.Debug;
import in.lib.writer.MultiFileCacheWriter;
import in.model.PrivateMessage;
import in.model.base.NetObject;
import in.obj.StreamMarker;
import in.rob.client.page.base.MessageStreamFragment;
import java.util.ArrayList;
import android.content.Context;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
/**
* Standard response handler for Message streams.
*
* Use {@link #getMessages()} in {@link #onCallback()} to get the returned Messages
*/
public abstract class MessageStreamResponseHandler extends StreamResponseHandler<MessageStreamFragment>
{
public MessageStreamResponseHandler(Context c, boolean append)
{
super(c, append);
}
@Override public void onSuccess()
{
JsonElement elements = getContent();
if (elements != null)
{
try
{
MultiFileCacheWriter writer = new MultiFileCacheWriter();
JsonArray jMessages = elements.getAsJsonObject().get("data").getAsJsonArray();
int size = jMessages.size();
setObjects(new ArrayList<NetObject>(size));
for (int index = 0; index < size; index++)
{
JsonObject message = jMessages.get(index).getAsJsonObject();
PrivateMessage p = new PrivateMessage().createFrom(message);
// something wrong happened (maybe a deletion)
if (p == null) continue;
getObjects().add(p);
writer.scheduleAsyncWrite(String.format(Constants.CACHE_USER, p.getPoster().getId()), p.getPoster());
}
if (elements.getAsJsonObject().has("meta"))
{
JsonObject meta = elements.getAsJsonObject().get("meta").getAsJsonObject();
if (meta.has("max_id"))
{
setFirstId(meta.get("max_id").getAsString());
}
else if (getObjects().size() > 0)
{
setFirstId(getObjects().get(0).getId());
}
if (meta.has("min_id"))
{
setLastId(meta.get("min_id").getAsString());
}
else if (getObjects().size() > 0)
{
setLastId(getObjects().get(getObjects().size() - 1).getId());
}
if (meta.has("more"))
{
setHasMore(meta.get("more").getAsBoolean());
}
setMarker(StreamMarker.fromObject(meta));
}
onCallback();
writer.executeAsyncWriteList();
}
catch (Exception e)
{
Debug.out(e);
setDidFail(true);
}
}
else
{
setDidFail(true);
}
}
}